﻿// ------------------------------------------------------------------------
// 版权信息
// 版权归重庆虫儿飞科技有限公司所有。
// 所有权利保留。
// 官方网站：https://netokit.com
// 许可证信息
// Neto.Kit 项目主要遵循 MIT 许可证和 Apache 许可证（版本 2.0）进行分发和使用。
// 许可证的完整文本可以在源代码树根目录中的 LICENSE-APACHE 和 LICENSE-MIT 文件中找到。
// 
// 使用条款
// 使用本代码应遵守相关法律法规和许可证的要求。
// 
// 免责声明
// 对于因使用本代码而产生的任何直接、间接、偶然、特殊或后果性损害，我们不承担任何责任。
// 
// 其他重要信息
// Neto.Kit 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。
// 有关 Neto.Kit 项目的其他详细信息，请参阅位于源代码树根目录中的 COPYRIGHT 和 DISCLAIMER 文件。
// 
// 更多信息
// 请访问 https://netokit.com 获取更多关于 Neto.Kit 项目的许可证和版权信息。
// ------------------------------------------------------------------------

namespace Neto.Files;

/// <summary>
///     文件扩展名
/// </summary>
public static class FileExtension
{
    /// <summary>
    ///     使用 SkiaSharp 验证文件是否为图片
    /// </summary>
    /// <param name="file">上传的文件对象</param>
    /// <returns>如果文件是图片则返回 true，否则返回 false</returns>
    public static bool IsValidFileExtension(this IFormFile file)
    {
        // 将文件内容复制到内存流中
        try
        {
            using var memoryStream = new MemoryStream();
            file.CopyTo(memoryStream);
            // 使用 FileTypeCheck 类验证文件扩展名
            return FileTypeCheck.IsValidFileExtension(memoryStream, file.FileName.GetExtension());
        }
        catch (Exception e)
        {
            // 捕获异常并返回 false
            return false;
        }
    }

    /// <summary>
    ///     获取文件扩展名
    /// </summary>
    /// <param name="filePath">文件路径</param>
    /// <returns>文件扩展名（包括前缀点）</returns>
    public static string GetExtension(this string filePath)
    {
        // 使用 Path 类获取文件扩展名
        var ext = Path.GetExtension(filePath);
        return ext;
    }

    /// <summary>
    ///     验证文件的真实格式是否有效
    /// </summary>
    /// <param name="filePath">文件完整路径</param>
    /// <returns>如果文件格式有效则返回 true，否则返回 false</returns>
    public static bool IsValidFileExtension(string filePath)
    {
        // 打开文件并读取前 160 字节
        using var file = File.OpenRead(filePath);
        using var memoryStream = new MemoryStream();
        file.CopyTo(memoryStream);
        var bytes = new byte[160];
        memoryStream.Position = 0;
        memoryStream.Read(bytes, 0, bytes.Length);

        // 使用 FileTypeCheck 类验证文件格式
        var pass = FileTypeCheck.IsValidFileExtension(filePath, bytes);

        return pass;
    }

    /// <summary>
    ///     获取文件名（不包括扩展名）
    /// </summary>
    /// <param name="filePath">文件路径</param>
    /// <returns>文件名（不包括扩展名）</returns>
    public static string GetFileNameWithoutExtension(this string filePath)
    {
        // 使用 Path 类获取文件名（不包括扩展名）
        var fileName = Path.GetFileNameWithoutExtension(filePath);
        return fileName;
    }

    /// <summary>
    ///     获取文件的完整路径
    /// </summary>
    /// <param name="directoryPath">目录路径</param>
    /// <param name="fileName">文件名（包括扩展名）</param>
    /// <returns>文件的完整路径</returns>
    public static string GetFullPath(this string directoryPath, string fileName)
    {
        // 使用 Path 类获取文件的完整路径
        var fullPath = Path.Combine(directoryPath, fileName);
        return fullPath;
    }

    /// <summary>
    ///     根据文件名获取对应的 MIME 类型。
    /// </summary>
    /// <param name="fileName">文件名。</param>
    /// <returns>文件的 MIME 类型。</returns>
    public static string GetFileMimeType(this string fileName)
    {
        var provider = new FileExtensionContentTypeProvider();
        if (provider.TryGetContentType(fileName, out var contentType)) return contentType;
        return "application/octet-stream";
    }
}